package subraSoft.fenix.model.authentication.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;

import subraSoft.centaurus.model.cobj.CenDefaultCObj;
import subraSoft.centaurus.model.domain.CenDefaultDO;
import subraSoft.centaurus.model.service.CenIABMService;
import subraSoft.centaurus.model.service.CenIPaginableService;
import subraSoft.centaurus.model.service.impl.CenDefaultServiceImpl;
import subraSoft.fenix.model.authentication.cobj.FenUsuarioCObj;
import subraSoft.fenix.model.authentication.domain.FenPerfilDO;
import subraSoft.fenix.model.authentication.domain.FenUsuarioDO;
import subraSoft.fenix.model.authentication.service.FenEncryptUtil;
import subraSoft.fenix.model.authentication.service.FenUsuarioService;

public class FenUsuarioServiceImpl extends CenDefaultServiceImpl 
	implements FenUsuarioService, CenIABMService, CenIPaginableService 
{

	@SuppressWarnings("unchecked")
	public List<CenDefaultCObj> getList()
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		List<CenDefaultCObj> res = new ArrayList<CenDefaultCObj>();
		Criteria c = session.createCriteria(FenUsuarioDO.class);
		List<CenDefaultDO> usuarios = c.list();
		
		for (CenDefaultDO usuarioDO : usuarios) 
		{
			res.add(getCObj((FenUsuarioDO) usuarioDO));
		}
		
		session.getTransaction().commit();
		return res;
	}

	private CenDefaultCObj getCObj(FenUsuarioDO usuarioDO) 
	{
		FenUsuarioCObj cObj = new FenUsuarioCObj();
		cObj.setId(usuarioDO.getId());
		cObj.setNombre(usuarioDO.getNombre());
		cObj.setApellido(usuarioDO.getApellido());
		if(usuarioDO.getPerfil() != null)
			cObj.setIdPerfil(usuarioDO.getPerfil().getId());
		
		return cObj;
	}

	public Object saveOrUpdate(CenDefaultCObj cobj) 
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		 FenUsuarioCObj cObj = (FenUsuarioCObj)cobj;
		FenUsuarioDO usuarioDO;
		
		usuarioDO = (FenUsuarioDO) session.get(FenUsuarioDO.class, (String)cobj.getId());
		if(usuarioDO == null)
		{
			usuarioDO = new FenUsuarioDO();
			usuarioDO.setId((String) cObj.getId());
		}
		
		usuarioDO.setNombre((String) cObj.getNombre());
		usuarioDO.setApellido((String) cObj.getApellido());
		
		if(cObj.getPassword() != null && cObj.getPassword().equals(""))
			usuarioDO.setPass("");
		
		if(usuarioDO.getPerfil() == null || (usuarioDO.getPerfil() != null && !cObj.getIdPerfil().equals(usuarioDO.getPerfil().getId())))
		{
			FenPerfilDO perf = (FenPerfilDO) session.get(FenPerfilDO.class, (String)cObj.getIdPerfil());
			usuarioDO.setPerfil(perf);
		}
		
		session.saveOrUpdate(usuarioDO);
		
		session.getTransaction().commit();
		
		return usuarioDO.getId();
	}
	
	public void delete(CenDefaultCObj cobj) 
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		CenDefaultDO defDO = (CenDefaultDO) session.load(FenUsuarioDO.class, (String)cobj.getId());
		session.delete(defDO);
		
		session.getTransaction().commit();
	}

	public void blanquarClave(String idUsr) {
		// TODO Auto-generated method stub
		
	}

	public boolean claveEnBlanco(String idUsr) 
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		boolean res = false;
		
		FenUsuarioDO user = (FenUsuarioDO) session.get(FenUsuarioDO.class, idUsr);
		String passEncriptada = user.getPass();
		
		if(passEncriptada == null || passEncriptada.isEmpty())
			res = true;
		
		session.getTransaction().commit();
		return res;
	}

	public boolean validarClave(String idUsr, String pass)
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
	
		FenUsuarioDO user = (FenUsuarioDO) session.get(FenUsuarioDO.class, idUsr);
		String passEncriptada = user.getPass();
		
		boolean res = FenEncryptUtil.getInstance().encrypt(pass).equals(passEncriptada);
		
		session.getTransaction().commit();
		return res;
	}
	
	public void setearPass(String idUsr, String pass)
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		FenUsuarioDO userDO = (FenUsuarioDO) session.get(FenUsuarioDO.class, idUsr);
		userDO.setPass(FenEncryptUtil.getInstance().encrypt(pass));
		session.saveOrUpdate(userDO);
		session.getTransaction().commit();
	}

	public List<CenDefaultCObj> getList(int startIndex, int pageSize) 
	{
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		List<CenDefaultCObj> res = new ArrayList<CenDefaultCObj>();
		Criteria c = session.createCriteria(FenUsuarioDO.class);
		c.setFirstResult(startIndex);
		c.setFetchSize(pageSize);
		
		List<CenDefaultDO> usuarios = c.list();
		
		for (CenDefaultDO usuarioDO : usuarios) 
		{
			res.add(getCObj((FenUsuarioDO) usuarioDO));
		}
		
		session.getTransaction().commit();
		return res;
	}

	public int getSize() {
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		int res = (Integer)session.createCriteria(FenUsuarioDO.class).setProjection(Projections.rowCount()).uniqueResult();
		session.getTransaction().commit();
		return res;
	}

	


}
